| Автор перевода: Майкл "Antares" Клишин | Предыдущая | Следующая | Оглавление |
Flash Player 7.
try {
// ... блок try ...
} finally {
// ... блок finally ...
}
try {
// ... блок try ...
} catch(error[:ErrorType1]) {
// ... блок catch ...
} [catch(error[:ErrorTypeN]) {
// ... блок catch ...
}] [finally {
// ... блок finally ...
}]
error Выращение-ошибка, генерируемое выражением throw, обычно экземпляр класса Error или одного из его подклассов.
ErrorType Необязательный указатель типа для идентификатора error. Если параметр указан, блок catch будет обрабатывать только определенный тип ошибок.
Ключевые слова; Между ними заключается блок кода, который может вызвать ошибку, и обработчик ошибок. Если какой-либо код в блоке try генерирует ошибку (используя выражение throw), контроль передается блоку catch, если таковой существует, а затем выполняется блок finally, опять же, если он существует. Блок finally исполняется в любом случае, вне зависимости от того, какая ошибка была сгенерирована. Если код в блоке try не генерирует ошибок (то есть, если код в блоке try исполняется нормально), код в блоке finally все равно исполняется. Код в блоке finally исполняется, даже если код в блоке try заканчивает исполнение после выражения return.
За блоком try должен следовать блок catch, блок finally или оба этих блока. Один блок try может иметь несколько блоков catch, но только один блок finally. Вложеность блоков try может быть сколь угодно глубокой.
Параметр error в обработчике ошибок catch должен быть обычным идентификатором, например, e или theException, или же x. Переменная в обработчике catch может быть типизирована. При использовании нескольких блоков catch, типизированные ошибки позволяют вам обрабатывать множество типов ошибок из одного блока try.
Если исключение генерирует ошибку с типом объект, будет произведена проверка, принадлежит ли он указанному классу или его подклассам. Если да, исполняется соответствующий блок catch. В противном случае блок catch не исполняется, а объект посылается блоком try следующему блоку catch и снова происходит проверка, и т.д.
Если ошибка генерируется внутри функции и функция не имеет обработчика catch, интерпретатор ActionScript завершает выполнение функции, равно как и всех вызывающих ее функций, пока не будет обнаружен блок catch. Одновременно с этим исполняются все встреченные в коде обработчики finally.
Код в нижеследующем примере показывает, как создать выражение try..finally. Так как код в блоке finally будет исполнен в любом случае, он обычно используется для устранения каких-либо последствий исполнения блока try. В следующем примере функция setInterval()вызывает функцию каждые 1000 миллисекунда (1 секунду). В случае возникновения ошибки, ошибка генерируется и обрабатывается блоком catch. Блок finally исполняется всегда, даже если ошибка не генерируется. Так как в примере мы используем setInterval(), в блоке finally необходимо разместить clearInterval(), чтобы убедиться, что интервал удален из памяти.
myFunction = function () {
trace("Запустилась функция myFunction");
};
try {
myInterval = setInterval(this, "myFunction", 1000);
throw new Error("Моя ошибка");
} catch (myError:Error) {
trace("Зафиксирована ошибка: "+myError);
} finally {
clearInterval(myInterval);
trace("Ошибка обработана");
}
В следующем примере блок finally используется для того, чтобы удалить объект, вне зависимости от того, была ли зафиксирована ошибка. Создайте новый AS файл Account.as.
class Account {
var balance:Number = 1000;
function getAccountInfo():Number {
return (Math.round(Math.random()*10)%2);
}
}
В той же директории, что и Account.as, создайте новый FLA файл и введите следующий код в первый кадр Таймлайна:
import Account;
var account:Account = new Account();
try {
var returnVal = account.getAccountInfo();
if (returnVal != 0) {
throw new Error("Ошибка при получении информации об аккаунте.");
}
} finally {
if (account != null) {
delete account;
}
}
Код в нижеследующем примере демонстрирует использование выражения try..catch. Код в блоке try выполняется, в случае возникновения исколючения внутри блока try, контроль передается блоку catch, показывающем сообщение об ошибке в текстовом поле, используя при этом метод Error.toString().
В той же директории, что и Account.as, создайте новый FLA документ и введите этот код в первом кадре Таймлайна:
import Account;
var account:Account = new Account();
try {
var returnVal = account.getAccountInfo();
if (returnVal != 0) {
throw new Error("Ошибка при получении информации об аккаунте.");
}
trace("Операция произведена успешно");
} catch (e) {
this.createTextField("status_txt", this.getNextHighestDepth(), 0, 0, 100, 22);
status_txt.autoSize = true;
status_txt.text = e.toString();
}
Код в нижеследующем примере показывает использование блока try с множеством типизированных блоков catch. В зависимости от типа ошибки, блок try выдает определенный тип объекта . В данном случае, myRecordSet если экземпляр некого гипотетического класса RecordSet, чей метод sortRows() может вызывать два вида ошибок , RecordSetException и MalformedRecord.
В следующем примере классы RecordSetException и MalformedRecord являются подклассами класса Error. Каждый определен в отдельном AS файле. (Для более подробной информации смотри "Создание пользовательских классов в ActionScript 2.0" в Использоваии ActionScript во Flash.)
// В файле RecordSetException.as:
class RecordSetException extends Error {
var message = "Ошибка в службе записей.";
}
// В файле MalformedRecord.as:
class MalformedRecord extends Error {
var message = "Ошибка. Обнаружена некорректная запись.";
}
Внутри метода sortRows() класса RecordSet генерируется ошибка одного из определенных выше типов, в зависимости от произошедшей исключительной ситуации. Следующий пример показывает, как может выглядеть сам код обработки ошибок внутри метода:
class RecordSet {
function sortRows() {
var returnVal:Number = randomNum();
if (returnVal == 1) {
throw new RecordSetException();
} else if (returnVal == 2) {
throw new MalformedRecord();
}
}
function randomNum():Number {
return Math.round(Math.random()*10)%3;
}
}
Наконец, в еще одном FLA файле следующий код вызывает метод sortRows() экземпляра класса RecordSet. В нем определен блок catch для каждого типа ошибок, выдаваемых методом sortRows().
import RecordSet;
var myRecordSet:RecordSet = new RecordSet();
try {
myRecordSet.sortRows();
trace("Все отлично");
} catch (e:RecordSetException) {
trace(e.toString());
} catch (e:MalformedRecord) {
trace(e.toString());
}
Класс Error, throw, class, extends
| Посмотреть комментарии LiveDocs | Предыдущая | Следующая | Оглавление | |